package main

import (
	"fmt"
	"time"
)

// 临界资源，卖票

// 在Go的并发编程中有一句很经典的话：不要以共享内存的方式去通信，而要以通信的方式去共享内存。
// 在Go语言中并不鼓励用锁保护共享状态的方式在不同goroutine中分享信息（以共享内存的方式去通信），而是鼓励通过channel将共享
// 状态或者共享状态的变化在各个goroutine之间传递（以通信的方式去共享内存），这样同样能像用锁一样保证在同一的时间只有一个goroutine访问共享状态
var ticket = 100

func main() {
	go saleTickets("窗口1")
	go saleTickets("窗口2")
	go saleTickets("窗口3")
	go saleTickets("窗口4")
	time.Sleep(time.Second * 6)
}

func saleTickets(name string) {
	for {
		if ticket > 0 {
			fmt.Println(name, "售出", ticket)
			ticket--
		} else {
			fmt.Println(name, "售罄,没有票了...")
			break
		}
	}
}
